import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Timeline



# 用pandas.read_csv()读取指定的excel文件，选择编码格式gb18030
df = pd.read_csv('weather.csv', encoding='gb18030')
# print(df['日期'])

# 使用pandas.apply() 函数自动遍历DataFrame对象，然后使用lambda表达式逐个将字符串转化成时间类型

df['日期'] = df['日期'].apply(lambda x: pd.to_datetime(x.replace('年', '-').replace('月', '-').replace('日', '')))
# print(df['日期'])


# 新建一个月份数据（将日期中的月份一项单独拿去出来）
df['month'] = df['日期'].dt.month
# print(df['month'])

# 使用reset_index()重置索引，如果不重置索引就会默认把month列作为索引列，但是month列已经不是连续的索引了
df_agg = df.groupby(['month', '天气状况']).size().reset_index()
# print(df_agg)


# 设置下这三列的列名
df_agg.columns = ['month', '天气状况', 'count']
#print(df_agg)

# 天气数据的形成
# 选择一月的所有数据（bool值取数据），将里面的‘天气情况’，‘count’2列数据拿出来排序
# 关于排序怎么排，以‘count’列为例，逆序（从大到小排列），因为目前取出来的是DataFrame的数据类型
# .value：拿出来的数据是一个numpy.ndarray数组，再用.tolist()转化成列表数据
#print(df_agg[df_agg['month'] == 1][['天气状况', 'count']].sort_values(by='count',ascending=False))


# 画图
# 实例化一个时间序列的对象
timeline = Timeline()
# 播放参数：设置时间间隔 1s 单位是：ms
timeline.add_schema(play_interval=1000)   # 单位是ms


# 循环遍历df_agg['month']里面的唯一值
for month in df_agg['month'].unique():
    # 获取天气的值
    data = (
        df_agg[df_agg['month'] == month][['天气状况', 'count']].sort_values(by='count', ascending=True).values.tolist()
    )
    # print(data)

    # 绘制柱状图
    bar = Bar()
    # x轴是天气名称
    bar.add_xaxis([x[0] for x in data])
    # y轴是出现次数
    bar.add_yaxis('',[x[1] for x in data])

    # 让柱状图横着放
    bar.reversal_axis()
    # 将计数标签放置在图像右边
    bar.set_series_opts(label_opts=opts.LabelOpts(position='right'))
    # 设置图标名称
    bar.set_global_opts(title_opts=opts.TitleOpts(title='2024年铜陵每月天气变化'))
    # 将设置好的bar对象放置到时间轮播图当中，并且标签选择月份 格式为：数字月
    timeline.add(bar,f'{month}月')

# 将设置好的图表保存为weathers.html文件
timeline.render('weathers.html')
